package com.cib.xagcjs.biz;

import com.alibaba.fastjson.JSONObject;
import com.cib.xagcjs.common.BlockchainNotification;
import com.cib.xagcjs.common.Result;
import com.cib.xagcjs.common.RmbResponse;
import com.cib.xagcjs.dal.MessageLogMapper;
import com.cib.xagcjs.dal.PaymentNotifyMapper;
import com.cib.xagcjs.utils.CryptoUtils;
import com.cib.xagcjs.utils.TimeUtil;
import com.cib.xagcjs.vo.PaymentNotify;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 推送消息实现层
 */
@Service
@Slf4j
public class PaymentNotifyService {

    @Autowired
    private MessageLogMapper messageLogMapper;

    @Autowired
    private PaymentNotifyMapper paymentNotifyMapper;

    @Autowired
    private CryptoUtils cryptoUtils;

    /**
     * 推送消息
     * @param req 消息内容
     * @return 统一返回报文
     */
    public RmbResponse sendMessage(String req) {
        String s = cryptoUtils.decryptAndVerify(req);
        BlockchainNotification notification = JSONObject.parseObject(s, BlockchainNotification.class);
        PaymentNotify data = JSONObject.parseObject(notification.getData(), PaymentNotify.class);
        // 获取当前通知时间
        //yyyy-MM-dd HH:mm:ss
        data.setNotifyTime(TimeUtil.getNowTime());
        log.info("推送报文日志打印：" + notification);
        log.info("data数据日志打印：" + data);

        // 接收的消息入库通知主表
        if (paymentNotifyMapper.insertNotify(data) > 0) {
            log.info("通知主表数据入库成功!");
            // 存入消息记录表
            if (messageLogMapper.insertMessageLog(2,"接收推送消息",TimeUtil.getNowTime(),JSONObject.toJSONString(data)) > 0) {
                log.info("消息记录入库成功!");
            } else {
                log.info("消息记录入库失败!");
            }
        } else {
            log.info("通知主表数据入库失败!");
        }

        // 此处写推送业务
        // 接收的通知数据发给后台处理 (此处为模拟)

        RmbResponse rmbResponse = new RmbResponse();
        Result<Object> success = Result.success();
        rmbResponse.setResult(success);
        if (rmbResponse.getResult().getStatus().equals("OK")) {
            log.info("推送成功");
            return rmbResponse;
        }

        Result<Object> error = Result.error("推送失败");
        rmbResponse.setResult(error);
        log.info("推送失败");
        return rmbResponse;
    }

    /**
     * 根据批次号查询批次时间
     * @param batch 批次号
     * @return 批次时间
     */
    public String findNotifyTime(String batch) {
        return paymentNotifyMapper.findNotifyTime(batch);
    }

    /**
     * 根据batch修改其通知的状态为 1、2、3、4 已获取支付信息
     * @param batch status 批次号和
     * @return 执行影响的行数
     */
    public int updateStatus(String batch, int status) {
        return paymentNotifyMapper.updateStatus(batch, status);
    }

    /**
     * 根据所选状态查询批次数组
     * @return 批次数组
     */
    public String[] selectBatches(int status) {
        return paymentNotifyMapper.selectBatches(status);
    }

    /**
     * 查询当前批次入库时记录的总笔数信息
     * @param batch 批次号
     * @return 总笔数
     */
    public int selectTotalNum(String batch) {
        return paymentNotifyMapper.selectTotalNum(batch);
    }

    /**
     * 根据batch获取当前批次的主表通知信息
     * @param batch 批次号
     * @return 批次信息
     */
    public PaymentNotify selectPayNotify(String batch) {
        return paymentNotifyMapper.selectPayNotify(batch);
    }
}
